package br.com.petsis.funcionalidades.manterRaca;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.Perfil;
import br.com.petsis.entity.Raca;

@Name("manterRacaController")
@Scope(ScopeType.CONVERSATION)
@Restrict(value="#{!identity.hasRole('"+Perfil.PERFIL_VETERINARIA+"')}")
public class ManterRacaController {
	
	private static final String QRY_RACAS = "select r from Raca r where r.empresa.idEmpresa = :idEmpresa and r.flgAtivo = 'T' order by r.dscNome";
	private static final String QRY_RACA_VALIDACAO = "select r from Raca r where r.empresa.idEmpresa = :idEmpresa and UPPER(r.dscNome) = UPPER(:dscNome) and r.flgAtivo = 'T'";
	
	private static final String PARAMETER_DSC_NOME = "dscNome";
	private static final String PARAMETER_ID_EMPRESA = "idEmpresa";

	@In(create=true)
	private EntityManager entityManager;
	
	private List<Raca> listaRacas;
	
	private Raca racaEdicao;
	
	private boolean selecionadoTodos;
	
	private String filtroNome;
	
	private String filtroPorte;
	
	@In(required=false)
	private Empresa empresaSessao;
	
	public boolean filtrarRacasPorNome(Object current){
		Raca raca = (Raca)current;
		if(getFiltroNome() == null || getFiltroNome().isEmpty()){
			return true;
		}
		if(raca.getDscNome().toLowerCase().contains(getFiltroNome().toLowerCase())){
			return true;
		}else{
			return false;
		}
	}
	
	public boolean filtrarRacasPorPorte(Object current){
		Raca raca = (Raca)current;
		if(getFiltroPorte() == null || getFiltroPorte().isEmpty()){
			return true;
		}
		if(raca.getPorteExtenso().toLowerCase().contains(getFiltroPorte().toLowerCase())){
			return true;
		}else{
			return false;
		}
	}

	public String getFiltroPorte() {
		return filtroPorte;
	}

	public void setFiltroPorte(String filtroPorte) {
		this.filtroPorte = filtroPorte;
	}

	public String getFiltroNome() {
		return filtroNome;
	}

	public void setFiltroNome(String filtroNome) {
		this.filtroNome = filtroNome;
	}

	public List<Raca> getListaRacas() {
		if (listaRacas == null) {
			if(empresaSessao != null){
				listaRacas = entityManager.createQuery(QRY_RACAS)
					.setParameter(PARAMETER_ID_EMPRESA, empresaSessao.getIdEmpresa())
					.getResultList();
			}else{
				listaRacas = new ArrayList<Raca>();
			}
		}
		return listaRacas;
	}

	public void setListaRacas(List<Raca> listaRacas) {
		this.listaRacas = listaRacas;
	}
	
	public void editar(Raca racaEscolhida){
		setRacaEdicao(racaEscolhida);
	}
	
	public void cancelar(){
		setRacaEdicao(new Raca());
	}
	
	public void salvar(){
		if(empresaSessao == null){
			FacesMessages.instance().add(Severity.ERROR,"Somente empresas podem salvar raças.");
			return;
		}
		getRacaEdicao().setFlgAtivo('T');
		getRacaEdicao().setEmpresa(empresaSessao);
		try{
			Raca racaSalva = (Raca)entityManager.createQuery(QRY_RACA_VALIDACAO)
				.setParameter(PARAMETER_DSC_NOME, getRacaEdicao().getDscNome())
				.setParameter(PARAMETER_ID_EMPRESA, empresaSessao.getIdEmpresa())
				.getSingleResult();
			if(getRacaEdicao().getIdRaca() != null && getRacaEdicao().getIdRaca().equals(racaSalva.getIdRaca())){
				entityManager.merge(racaEdicao);
				entityManager.flush();
				setRacaEdicao(new Raca());
				setListaRacas(null);
				getListaRacas();
				FacesMessages.instance().add(Severity.INFO,"Raça salva com sucesso.");
			}else{
				FacesMessages.instance().add(Severity.ERROR,"Não é permitido salvar duas raças com o mesmo nome.");
			}
		}catch (NoResultException e) {
			entityManager.merge(racaEdicao);
			entityManager.flush();
			setRacaEdicao(new Raca());
			setListaRacas(null);
			getListaRacas();
			FacesMessages.instance().add(Severity.INFO,"Raça salva com sucesso.");
		}
	}

	public Raca getRacaEdicao() {
		if (racaEdicao == null) {
			racaEdicao = new Raca();
		}
		return racaEdicao;
	}

	public void setRacaEdicao(Raca racaEdicao) {
		this.racaEdicao = racaEdicao;
	}
	
	public void excluir(){
		List<Raca> listaRemocao = new ArrayList<Raca>();
		for(Raca r : getListaRacas()){
			if(r.isSelecionado()){
				r.setFlgAtivo('F');
				entityManager.merge(r);
				listaRemocao.add(r);
			}
		}
		entityManager.flush();
		getListaRacas().removeAll(listaRemocao);
	}
	
	public void selecionaTodos(){
		for(Raca r : getListaRacas()){
			if(isSelecionadoTodos()){
				r.setSelecionado(true);
			}else{
				r.setSelecionado(false);
			}
		}
	}

	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}
	
}
